

// 冒泡排序
(() => {
  function fac (arr) {
    if (arr.length < 0) {
      return;
    }
    const len = arr.length;
    for (let i = 0; i < len; i++) {
      for (let j = i + 1; j < len; j++) {
        if (arr[i] > arr[j]) {
          [arr[i], arr[j]] = [arr[j], arr[i]];
        }
      }
    }
  }
  let arr = [1, 2, 3, 5, 4];
  fac(arr);
  console.log('冒泡排序', arr);
})();

// 选择排序
(function () {
  function fac (arr) {
    if (Object.prototype.toString.call(arr) != '[object Array]') {
      return;
    }
    let len = arr.length;
    for (let i = 0; i < len; i++) {
      let min = i;
      for (let j = min + 1; j < len; j++) {
        if (arr[min] > arr[j]) {
          min = j;
        }
        [arr[min], arr[j]] = [arr[j], arr[min]];
      }
    }
  }
  let arr = [1, 31, 4, 5, 2];
  fac(arr);
  console.log('选择排序', arr);
})();


// 快速排序
(() => {
  function fac (arr) {
    if (!(arr instanceof Array)) {
      return;
    }
    fac__(arr, 0, arr.length - 1);
  }
  let arr = [1, 3, 2, 5, 4, 5];
  fac(arr);
  console.log('快速排序', arr);

  function fac__ (arr, l, r) {
    if (l >= r) return;
    let i = l - 1, j = r + 1;
    let x = arr[l + r >> 1];
    while (i < j) {
      do {
        i++;
      } while (x > arr[i]);
      do {
        j--
      } while (x < arr[j]);

      if (i < j) {
        [arr[i], arr[j]] = [arr[j], arr[i]];
      }
    }
    fac__(arr, l, j), fac__(arr, j + 1, r);
  }

})();


(() => {
  function fac (arr) {
    arr.sort(function (x, y) {
      return x - y;
    })
  }
  var arr = [12, 3, 2, 5, 4];
  fac(arr);
  console.log('sort (x-y)', arr);
})();

